{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Get ERCOT Ancillary Services Prices" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import gridstatus\n", "import pandas as pd\n", "import plotly.express as px" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "iso = gridstatus.Ercot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Get Ancillary Services Prices\n", "\n", "Note: the time specified is the delivery time of the ancillary service" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
TimeMarketNon-Spinning ReservesRegulation DownRegulation UpResponsive Reserves
02022-11-29 00:00:00-06:00DAM0.754.003.192.39
12022-11-29 01:00:00-06:00DAM0.553.694.692.69
22022-11-29 02:00:00-06:00DAM0.482.413.192.39
32022-11-29 03:00:00-06:00DAM0.693.504.692.69
42022-11-29 04:00:00-06:00DAM0.504.005.982.69
\n", "
" ], "text/plain": [ " Time Market Non-Spinning Reserves Regulation Down \\\n", "0 2022-11-29 00:00:00-06:00 DAM 0.75 4.00 \n", "1 2022-11-29 01:00:00-06:00 DAM 0.55 3.69 \n", "2 2022-11-29 02:00:00-06:00 DAM 0.48 2.41 \n", "3 2022-11-29 03:00:00-06:00 DAM 0.69 3.50 \n", "4 2022-11-29 04:00:00-06:00 DAM 0.50 4.00 \n", "\n", " Regulation Up Responsive Reserves \n", "0 3.19 2.39 \n", "1 4.69 2.69 \n", "2 3.19 2.39 \n", "3 4.69 2.69 \n", "4 5.98 2.69 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = iso.get_as_prices(\"today\")\n", "df.head(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Get Historical AS Prices\n", "\n", "ERCOT publishes the last 30 days of prices." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 31/31 [00:16<00:00, 1.90it/s]\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
TimeMarketNon-Spinning ReservesRegulation DownRegulation UpResponsive Reserves
02022-10-30 00:00:00-05:00DAM2.852.343.891.89
12022-10-30 01:00:00-05:00DAM2.721.613.591.59
22022-10-30 02:00:00-05:00DAM2.010.682.811.39
32022-10-30 03:00:00-05:00DAM2.001.413.391.39
42022-10-30 04:00:00-05:00DAM2.001.693.671.49
.....................
7402022-11-29 19:00:00-06:00DAM1.742.692.312.00
7412022-11-29 20:00:00-06:00DAM1.092.492.312.00
7422022-11-29 21:00:00-06:00DAM1.043.493.492.39
7432022-11-29 22:00:00-06:00DAM1.004.005.983.00
7442022-11-29 23:00:00-06:00DAM1.045.005.003.00
\n", "

745 rows × 6 columns

\n", "
" ], "text/plain": [ " Time Market Non-Spinning Reserves Regulation Down \\\n", "0 2022-10-30 00:00:00-05:00 DAM 2.85 2.34 \n", "1 2022-10-30 01:00:00-05:00 DAM 2.72 1.61 \n", "2 2022-10-30 02:00:00-05:00 DAM 2.01 0.68 \n", "3 2022-10-30 03:00:00-05:00 DAM 2.00 1.41 \n", "4 2022-10-30 04:00:00-05:00 DAM 2.00 1.69 \n", ".. ... ... ... ... \n", "740 2022-11-29 19:00:00-06:00 DAM 1.74 2.69 \n", "741 2022-11-29 20:00:00-06:00 DAM 1.09 2.49 \n", "742 2022-11-29 21:00:00-06:00 DAM 1.04 3.49 \n", "743 2022-11-29 22:00:00-06:00 DAM 1.00 4.00 \n", "744 2022-11-29 23:00:00-06:00 DAM 1.04 5.00 \n", "\n", " Regulation Up Responsive Reserves \n", "0 3.89 1.89 \n", "1 3.59 1.59 \n", "2 2.81 1.39 \n", "3 3.39 1.39 \n", "4 3.67 1.49 \n", ".. ... ... \n", "740 2.31 2.00 \n", "741 2.31 2.00 \n", "742 3.49 2.39 \n", "743 5.98 3.00 \n", "744 5.00 3.00 \n", "\n", "[745 rows x 6 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "thirty_days_ago = pd.Timestamp.now().date() - pd.Timedelta(days=30)\n", "df = iso.get_as_prices(start=thirty_days_ago, end=\"today\")\n", "df" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": "Oct 302022Nov 6Nov 13Nov 20Nov 27050100150200250300350400AS TypeNon-Spinning ReservesRegulation DownRegulation UpResponsive ReservesAncillary Services Prices for ERCOT, last 30 daysTimeMarket Clearing Price" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "data = df.set_index(\"Time\").drop(columns=[\"Market\"])\n", "data.columns.name = \"AS Type\"\n", "fig = px.line(\n", " data,\n", " x=data.index,\n", " y=data.columns,\n", " title=\"Ancillary Services Prices for ERCOT, last 30 days\",\n", ")\n", "fig.update_yaxes(title=\"Market Clearing Price\")\n", "fig.show(\"svg\", width=1200, height=600)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.10.2 64-bit ('isodata')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.2" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "49f14642123d0cc1afa9fa45716ed5f1e915189c28b01efe02a8b7ec3c0a3fce" } } }, "nbformat": 4, "nbformat_minor": 2 }